"""
医疗评估提示词模板
优化后的Prompt可以让AI评估更精细、更专业
"""

# 系统提示词 - 定义AI的角色和专业领域
SYSTEM_PROMPT = """你是一位资深的医疗质量管理专家，具有以下专业背景：
- 20年以上医疗质量控制经验
- 熟悉《医疗机构病历管理规定》和《病历书写基本规范》
- 掌握临床医学、药理学、医学统计学知识
- 擅长发现病历中的细微问题和潜在风险

你的评估标准严格、客观、专业，能够：
1. 识别病历中的缺失、错误、不规范之处
2. 评估诊断与治疗的合理性
3. 发现潜在的医疗风险
4. 提供专业的改进建议

请始终保持专业、严谨的态度进行评估。"""


# 增强版评估提示词 - 包含更多医疗专业知识
ENHANCED_EVALUATION_PROMPT = """# 病历质量评估任务

## 一、病历基本信息
{patient_info}

## 二、评估维度及标准

### 1. 完整性评估（30分）
**检查项：**
- ✅ 基本信息：姓名、性别、年龄、入院时间、科室
- ✅ 主诉：症状、持续时间（如"发热3天"）
- ✅ 现病史：发病过程、症状变化、诊治经过
- ✅ 既往史：既往疾病、手术史、传染病史
- ✅ 过敏史：药物过敏、食物过敏
- ✅ 体格检查：生命体征、阳性体征、阴性体征
- ✅ 辅助检查：实验室检查、影像学检查
- ✅ 诊断：主要诊断、次要诊断（符合ICD-10）
- ✅ 治疗方案：用药、手术、其他治疗

**评分规则：**
- 每缺少一项关键信息扣3-5分
- 信息不完整扣1-3分
- 完全缺失核心内容（如主诉、诊断）扣10分以上

### 2. 规范性评估（25分）
**检查项：**
- ✅ 医学术语使用规范（避免使用口语化表达）
- ✅ 时间记录格式统一（年-月-日 时:分）
- ✅ 数值单位规范（如体温36.5℃，血压120/80mmHg）
- ✅ 诊断名称符合ICD-10标准
- ✅ 药品名称使用通用名而非商品名
- ✅ 缩写使用规范（首次出现应注明全称）
- ✅ 病程记录格式符合要求

**评分规则：**
- 术语使用不当每处扣2分
- 格式不规范每处扣1-2分
- 严重不符合规范扣5分以上

### 3. 一致性评估（25分）
**检查项：**
- ✅ 诊断与症状相符（如诊断为"肺炎"，应有咳嗽、发热等症状）
- ✅ 用药与诊断匹配（如抗生素使用应有感染指征）
- ✅ 辅助检查结果与诊断一致
- ✅ 治疗方案与诊断相符
- ✅ 前后记录无矛盾（病程记录应连贯）
- ✅ 诊断与年龄性别匹配（如男性不会有妇科疾病）

**评分规则：**
- 轻度不一致扣2-3分
- 明显矛盾扣5-8分
- 严重逻辑错误扣10分以上

### 4. 准确性评估（20分）
**检查项：**
- ✅ 数值合理性（体温35-42℃，心率60-100次/分）
- ✅ 用药剂量准确（不超过推荐剂量）
- ✅ 诊断准确性（症状与诊断匹配）
- ✅ 检验值在参考范围或有合理解释
- ✅ 无明显医学错误

**评分规则：**
- 数值异常但可解释扣1-2分
- 明显错误扣5-10分
- 危及安全的错误扣15分以上

## 三、特殊关注点

### 🚨 高风险项（发现即严重扣分）
1. **药物过敏史记录但仍使用过敏药物** → 扣20分
2. **禁忌症下使用禁用药物** → 扣15分
3. **诊断与症状完全不符** → 扣15分
4. **关键信息完全缺失**（无诊断、无用药） → 扣15分
5. **用药剂量超出安全范围** → 扣10-20分

### 💡 加分项（做得特别好）
1. 病史采集详细、逻辑清晰 → +3分
2. 鉴别诊断完善 → +2分
3. 用药说明详细（注明用药目的） → +2分
4. 随访计划明确 → +1分

## 四、输出要求

请严格按照以下JSON格式输出（不要包含markdown代码块标记）：

{{
  "completeness_score": 整数(0-30),
  "standardization_score": 整数(0-25),
  "consistency_score": 整数(0-25),
  "accuracy_score": 整数(0-20),
  "overall_score": 整数(0-100, 四个维度分数之和),
  "issues": [
    {{
      "issue_type": "completeness|standardization|consistency|accuracy",
      "severity": "critical|major|minor|info",
      "field_name": "问题字段",
      "issue_description": "具体问题描述（专业、准确）",
      "suggestion": "改进建议（可操作）",
      "score_deduction": 扣分值
    }}
  ],
  "summary": "整体评估总结（100字以内，突出重点问题和优点）",
  "suggestions": [
    "建议1：具体、专业、可落地",
    "建议2：...",
    "建议3：..."
  ],
  "risk_level": "low|medium|high|critical",
  "strengths": ["优点1", "优点2"],
  "weaknesses": ["不足1", "不足2"]
}}

## 五、评估原则

1. **客观公正**：基于事实和标准评估，不受主观情绪影响
2. **专业严谨**：使用医学专业术语，评估标准符合临床实践
3. **具体明确**：指出问题时给出具体位置和改进方法
4. **风险导向**：优先关注可能影响患者安全的问题
5. **持续改进**：建议应该具体、可操作、有价值

---

现在开始评估以下病历：

{medical_record}
"""


# 简洁版提示词（用于快速评估）
QUICK_EVALUATION_PROMPT = """作为医疗质量专家，快速评估以下病历：

{medical_record}

评估要点：
1. 完整性：是否缺少关键信息
2. 规范性：格式和术语是否规范  
3. 一致性：诊断与症状是否匹配
4. 准确性：是否存在明显错误

输出JSON格式评估结果（不含markdown标记）。"""


# 专科评估提示词模板（可根据科室定制）
SPECIALTY_PROMPTS = {
    "内科": """
    内科病历重点关注：
    - 慢性病病史记录
    - 用药史的连续性
    - 实验室检查的动态变化
    - 并发症的识别
    """,
    
    "外科": """
    外科病历重点关注：
    - 手术指征是否明确
    - 术前评估是否完整
    - 手术记录是否详细
    - 术后观察是否到位
    """,
    
    "儿科": """
    儿科病历重点关注：
    - 生长发育指标
    - 喂养史和疫苗接种史
    - 儿童用药剂量计算
    - 监护人知情同意
    """,
    
    "妇产科": """
    妇产科病历重点关注：
    - 月经史、婚育史
    - 产检记录
    - 妊娠风险评估
    - 孕期用药安全
    """
}


def build_evaluation_prompt(
    record_data: dict,
    mode: str = "enhanced",
    specialty: str = None
) -> str:
    """
    构建评估提示词
    
    Args:
        record_data: 病历数据
        mode: 'enhanced' | 'quick'
        specialty: 科室名称（可选）
        
    Returns:
        完整的提示词
    """
    # 格式化病历信息
    patient_info = f"""
**患者信息：**
- 姓名：{record_data.get('patient_name', '未知')}
- 性别：{record_data.get('patient_gender', '未知')}
- 年龄：{record_data.get('patient_age', '未知')}岁
- 科室：{record_data.get('department', '未知')}
- 入院时间：{record_data.get('admission_date', '未记录')}

**临床信息：**
- 主诉：{record_data.get('chief_complaint', '未记录')}
- 现病史：{record_data.get('present_illness', '未记录')}
- 既往史：{record_data.get('past_history', '无特殊')}
- 过敏史：{record_data.get('allergy_history', '无')}
- 体格检查：{record_data.get('physical_exam', '未记录')}
- 辅助检查：{record_data.get('lab_results', '未记录')}
- 诊断：{', '.join(record_data.get('diagnosis', [])) if record_data.get('diagnosis') else '未明确'}

**治疗方案：**
{_format_medications(record_data.get('raw_data', {}).get('用药信息', []))}
"""
    
    # 选择模板
    if mode == "quick":
        template = QUICK_EVALUATION_PROMPT
    else:
        template = ENHANCED_EVALUATION_PROMPT
    
    # 添加专科重点
    specialty_note = ""
    if specialty and specialty in SPECIALTY_PROMPTS:
        specialty_note = f"\n\n**{specialty}重点：**\n{SPECIALTY_PROMPTS[specialty]}"
    
    return template.format(
        patient_info=patient_info,
        medical_record=patient_info + specialty_note
    )


def _format_medications(medications: list) -> str:
    """格式化用药信息"""
    if not medications:
        return "无用药记录"
    
    result = []
    for i, med in enumerate(medications, 1):
        med_text = f"{i}. {med.get('名称', '未知药物')}"
        if med.get('规格'):
            med_text += f" {med.get('规格')}"
        if med.get('用法'):
            med_text += f" {med.get('用法')}"
        if med.get('频次'):
            med_text += f" {med.get('频次')}"
        if med.get('天数'):
            med_text += f" {med.get('天数')}"
        result.append(med_text)
    
    return '\n'.join(result)


